#     Makefile 
#    Grupo Klow
# Organizacion de Datos


# CONFIGURACION
################

# Extension de los archivos a compilar (c para C, cpp o cc o cxx para C++).
extension = cpp
extension2 = c

# Archivos con el código fuente que componen los ejecutables.
fuenteshash = $(wildcard HashExtensible/src/*.$(extension2)) 
fuenteslogger = $(wildcard Logger/src/*.$(extension2))
fuentesarbolB = $(wildcard ArbolB/src/*.$(extension))
fuentescontrolador = $(wildcard ControladorIDsLibres/src/*.$(extension2))

# Para usar funciones de math.h
math = si

# Descomentar para ver la invocacion al compilador
#verbose = si

# CONFIGURACION "AVANZADA"
###########################

# Opciones para el compilador C/C++ en modo ansi.
CFLAGS = -Wall -pedantic -pedantic-errors

# Para que explote lo mas posible
#CFLAGS += -O3 -DNDEBUG

# Para valgrind o debug
CFLAGS += -ggdb -DDEBUG -fno-inline

# Opciones del enlazador.
LDFLAGS =

# Estandar de C a usar
CSTD = c99

# Estandar de C++ a usar
CXXSTD = c++98

# Si se quiere compilar estaticamente, descomentar la siguiente linea
#static = si


# VARIABLES CALCULADAS A PARTIR DE LA CONFIGURACION
####################################################

# Linkeo con libm de ser necesario.
ifdef math
LDFLAGS += -lm
endif


ifdef static
LDFLAGS += -static
endif

# Pongo flags de C para C++ tambien
CXXFLAGS += $(CFLAGS)

# Uso enlazador de c++ si es codigo no C.
ifeq ($(extension), c)
CFLAGS += -std=$(CSTD)
LD = $(CC)
else
CXXFLAGS += -std=$(CXXSTD)
LD = $(CXX)
endif

occ := $(CC)
ocxx := $(CXX)
orm := $(RM)
old := $(LD)
ifdef verbose
RM := $(RM) -v
else
CC =  @echo "  CC  $@"; $(occ)
CXX = @echo "  CXX $@"; $(ocxx)
RM =  @echo "  CLEAN"; $(orm)
LD =  @echo "  LD  $@"; $(old)
endif


# REGLAS
#########

.PHONY: all clean

all:  arbolB logger hashExtensible

o_controlador_files = $(patsubst %.$(extension1),%.o,$(fuentescontrolador))
o_hash_files = $(patsubst %.$(extension1),%.o,$(fuenteshash)) $(o_controlaldor_files)
o_arbolB_files = $(patsubst %.$(extension),%.o,$(fuentesarbolB)) $(o_controlaldor_files)
o_logger_files = $(patsubst %.$(extension1),%.o,$(fuenteslogger))

%.deps: %.$(extension)
	@set -e; rm -f $@; \
		$(old) -MM -MG -MP $(CXXFLAGS) $(CFLAGS) $< -MF $@.$$$$; \
		sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
		rm -f $@.$$$$

-include $(o_files:.o=.deps)


arbolB: $(o_arbolB_files)
	@if [ -z "$(o_arbolB_files)" ]; \
	then \
		echo "No hay archivos de entrada para el arbol."; \
		false; \
	fi >&2
	$(LD) $(LDFLAGS) $(o_arbolB_files) $(LOADLIBES) $(LDLIBS) -o arbolB $(LDADD)


logger: $(o_logger_files)
	@if [ -z "$(o_logger_files)" ]; \
	then \
		echo "No hay archivos de entrada para el logger."; \
		false; \
	fi >&2
	$(CC) $(LDFLAGS) $(o_logger_files) $(LOADLIBES) $(LDLIBS) -o logger $(LDADD)

hashExtensible: $(o_hash_files)
	@if [ -z "$(o_hash_files)" ]; \
	then \
		echo "No hay archivos de entrada para el hash."; \
		false; \
	fi >&2
	$(CC) $(LDFLAGS) $(o_hash_files) $(LOADLIBES) $(LDLIBS) -o hashExtensible $(LDADD)

clean:
	@$(RM) -fv *.o arbolB logger hashExtensible 


